home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 013 / nmove586.arc / COPYFILE.ASM next >
Encoding:
Assembly Source File  |  1986-05-24  |  5.2 KB  |  263 lines

  1.     TITLE copyfile
  2.     
  3.  
  4.  
  5. ;Routines
  6.  
  7.         public  ERROR_RET_JUMP,COPYFILE,DS1,DS2,AR1,RWLOOP,RWLOOP_EXIT,RETURN
  8.         public  ERROR_RET,READWRITE,readwrlp,R_RETURN
  9.  
  10. ;Variables
  11.  
  12.         public  HANDLE1,HANDLE2,SOURCE_FILE,NEW_FILE,BUFFER_SEGMENT
  13.  
  14.     EXTRN    BUFFER:WORD
  15.  
  16. G    GROUP    CODE
  17. CODE    SEGMENT    PUBLIC
  18.     ASSUME    DS:G, ES:G, CS:G, SS:G
  19.  
  20.  
  21. ; function calls
  22.  
  23. SET_DTA            EQU    1AH
  24. FIND_FIRST_FILE    EQU    4EH
  25. GET_DISK_SPACE        EQU    36H
  26. OPEN_FILE        EQU    3DH
  27. CLOSE_FILE        EQU    3EH
  28. CREATE_FILE        EQU    3CH
  29. DELETE_FILE        EQU    41H
  30. READ_FROM_FILE        EQU    3FH
  31. WRITE_TO_FILE        EQU    40H
  32. ACCESS_DATE_TIME    EQU    57H
  33. DISPLAY_STRING        EQU    9
  34.  
  35. ; error codes
  36. FILE_NOT_FOUND        EQU    11
  37. INVALID_DRIVE_SPECIFIER    EQU    1
  38. INSUFFICIENT_SPACE    EQU    8
  39. OPEN_ERROR        EQU    9
  40. CREATE_ERROR        EQU    10
  41. DATE_TIME_ERROR    EQU    12
  42. CLOSE_ERROR        EQU    13
  43. DELETE_ERROR        EQU    14
  44. READ_ERROR        EQU    16
  45. WRITE_ERROR        EQU    17
  46.     
  47. DATABLOCK    STRUC            ; For find first and find next
  48.         DB    21 DUP (?)    ;reserved for find_nexts
  49. ATTRIBUTE    DB    0
  50. TIME        DW    0
  51. DATE        DW    0
  52. LOW_SIZE    DW    0
  53. HIGH_SIZE    DW    0
  54. PNAME        DW    13 DUP (?)
  55. DATABLOCK    ENDS    
  56.  
  57. HANDLE1        DW    ?
  58. HANDLE2        DW    ?
  59. SOURCE_FILE    DW    ?
  60. NEW_FILE    DW    ?
  61. FILEINFO    DATABLOCK <,,,,,,>
  62. BUFFER_SEGMENT    DW    ?
  63.  
  64.  
  65. ERROR_RET_JUMP:
  66.     JMP    ERROR_RET
  67.  
  68. ;--------------------------------------------------------------------
  69.  
  70. COPYFILE    PROC
  71. ; This procedure will copy one file to another. It will check the drive
  72. ; of the second file to get the amount of disk space available, compare it 
  73. ; to the size of the first file and if the file will fit, copy it to the drive.
  74. ; call: dx -> source filename
  75. ;    di -> destination filename
  76. ;    Assume the drive letters are capitalized.
  77. ; return: carry = 1 if an error occurs and al will have the error code
  78.  
  79.     MOV    [SOURCE_FILE], DX
  80.     MOV    [NEW_FILE], DI
  81.  
  82.     MOV    AX, OFFSET G:BUFFER    ; Determine the buffer segment
  83.     mov    cx,4    
  84.     SHR    AX,cl
  85.     MOV    BX, CS
  86.     ADD    BX, AX
  87.     MOV    [BUFFER_SEGMENT], BX
  88.  
  89.     MOV    AH, SET_DTA
  90.     LEA    DX, FILEINFO
  91.     INT    21H
  92.     
  93.     MOV    AH, FIND_FIRST_FILE    ; get the file size
  94.     MOV    DX, [SOURCE_FILE]
  95.     MOV    CX, 0            ; find files
  96.     INT    21H
  97.  
  98.     MOV    AL, FILE_NOT_FOUND
  99.     JC    ERROR_RET_JUMP
  100.     
  101.     CMP BYTE PTR [DI+1], ":"    ; get the drive specifier 
  102.                     ; (default = 0, A = 1, etc  
  103.                     ; a = 1, b = 2, ... )
  104.     JZ     DS1
  105.     MOV    DL, 0            ; default
  106.     JMP     DS2
  107.  
  108. DS1:
  109.     MOV    DL, BYTE PTR [DI]
  110.     SUB     DL, "A"
  111.     INC    DL
  112.  
  113. DS2:
  114.     MOV    AH, GET_DISK_SPACE    ; get the free disk space
  115.                     ; DL = drive specifier
  116.     INT    21H
  117.  
  118.     MOV    SI, AX
  119.     CMP     AX, 0FFFFH
  120.     MOV    AL, INVALID_DRIVE_SPECIFIER
  121.     JZ    ERROR_RET_JUMP
  122.     MOV    AX, SI
  123.  
  124.             ; ax = sectors per allocation unit
  125.             ; bx = number of free allocation units on drive
  126.             ; cx = bytes per sector
  127.             ; dx = total number of allocation units on drive
  128.             
  129.             
  130.     MUL CX        ; free disk bytes = AX * BX * CX
  131.     MUL BX        
  132.     MOV BX, AX    ; dxbx := free disk bytes
  133.  
  134.     MOV    CX, [FILEINFO.HIGH_SIZE] ; compare bytesfree and filesize.
  135.     CMP     DX, CX            ; If there is not enough space quit.
  136.     MOV    AL, INSUFFICIENT_SPACE
  137.     JB    ERROR_RET_JUMP
  138.     JA    AR1
  139.  
  140.     MOV    CX, [FILEINFO.LOW_SIZE]
  141.     CMP     BX, CX
  142.     MOV    AL, INSUFFICIENT_SPACE
  143.     JBE    ERROR_RET_JUMP
  144.  
  145. AR1:
  146.     MOV    AH, OPEN_FILE
  147.     MOV    AL, 0            ; access := reading
  148.     MOV    DX, [SOURCE_FILE]
  149.     INT    21H
  150.     MOV    [HANDLE1], AX
  151.     MOV    AL, OPEN_ERROR
  152.     JC    ERROR_RET
  153.     
  154.     MOV    AH, CREATE_FILE
  155.     MOV    DX, [NEW_FILE]
  156.     MOV    CX, 0            ; attribute = file type
  157.     INT    21H
  158.     MOV    HANDLE2, AX
  159.     MOV    AL, CREATE_ERROR
  160.     JC    ERROR_RET    
  161.     
  162.     MOV    SI, [HANDLE1]    
  163.     MOV    DI, [HANDLE2]
  164.     
  165.     MOV    AX, [BUFFER_SEGMENT]    ; ds:dx := 64K buffer
  166.         MOV    DS, AX
  167.     MOV    DX, 0
  168.  
  169. RWLOOP:    
  170.     MOV    CX,7800h
  171.     CALL     READWRITE
  172.     JC    ERROR_RET
  173.     
  174.     CMP     CS:[FILEINFO.HIGH_SIZE], WORD PTR 0
  175.     JZ     RWLOOP_EXIT
  176.     
  177.     DEC     CS:[FILEINFO.HIGH_SIZE]
  178.     JMP     RWLOOP
  179.     
  180. RWLOOP_EXIT:
  181.     MOV    AX, CS
  182.     MOV    DS, AX    
  183.  
  184.     MOV    AH, ACCESS_DATE_TIME
  185.     MOV    AL, 0                ; get date and time
  186.     MOV    BX, [HANDLE1]
  187.     INT    21H
  188.     MOV    AL, DATE_TIME_ERROR
  189.     JC    ERROR_RET
  190.     
  191.     MOV    AL, 1                ; set date and time
  192.     MOV    BX, [HANDLE2]
  193.     INT    21H
  194.     
  195.     MOV    AH, CLOSE_FILE
  196.                         ; BX = handle
  197.     INT    21H
  198.     MOV    AL, CLOSE_ERROR
  199.     JC    ERROR_RET
  200.  
  201.     MOV    AH, CLOSE_FILE
  202.     MOV    BX, [HANDLE1]        ; close old file to return the handle
  203.     INT    21H
  204.     MOV    AL, CLOSE_ERROR
  205.     JC    ERROR_RET
  206.     
  207.     MOV    AH, DELETE_FILE
  208.     MOV    DX, [SOURCE_FILE]
  209.     INT    21H
  210.     MOV    AL, DELETE_ERROR
  211.     JC    ERROR_RET
  212.  
  213. RETURN:    
  214.     CLC        ; clear carry
  215.     RET
  216.  
  217. ERROR_RET:
  218.     STC
  219.     RET
  220. COPYFILE    ENDP
  221.  
  222. ;--------------------------------------------------------------------
  223.  
  224. READWRITE    PROC
  225. ;This subroutine will read from one file the specified number of bytes 
  226. ; and write out the bytes to another file.
  227. ; call:     CX = number of bytes to transfer.
  228. ;     SI = handle of the file to be read from.
  229. ;     DI = handle of the file to be written to.
  230. ;     DS:DX = pointer to a 64K buffer.
  231. ; return: carry is set if an error occurs in which case al := error code
  232.  
  233.     mov    bp,3
  234. readwrlp:    
  235.     MOV    AH, READ_FROM_FILE
  236.     MOV    BX, SI
  237.     INT    21H
  238.     MOV    CX, AX            ; AX = number of bytes read
  239.     MOV    AL, READ_ERROR
  240.     JC     R_RETURN
  241.     
  242.     MOV    AH, WRITE_TO_FILE
  243.     MOV    BX, DI
  244.     INT    21H
  245.     mov    cx,ax
  246.     MOV    AL, WRITE_ERROR
  247.     jc    r_return        ; maybe an error
  248.     dec    bp
  249.     jz    r_return        ; we have done a 16k chunk
  250.     cmp    cx,7800h
  251.     jae    readwrlp        ; do another chunk then
  252.     clc
  253.  
  254. R_RETURN:    
  255.     RET
  256. READWRITE    ENDP    
  257.  
  258. ;--------------------------------------------------------------------
  259.  
  260. CODE    ENDS
  261.     END
  262.  
  263.